package top.hzy520.job;

import com.alibaba.fastjson.JSONObject;
import com.dangdang.ddframe.job.api.ShardingContext;
import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.google.gson.JsonObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import top.hzy520.order.dao.MessageEventPublishMapper;
import top.hzy520.order.entity.MessageEventPublish;
import top.hzy520.user.dao.MessageEventProcessMapper;
import top.hzy520.user.dao.UserBonusPointsMapper;
import top.hzy520.user.entity.MessageEventProcess;
import top.hzy520.user.entity.UserBonusPoints;

/**
 * @Author: HouZeYu
 * @Description:  定时查询 消息接收表 （如果 发现未处理 的消息 则 增加 用户积分 修改 接收表消息状态 和 发送消息表 状态  这三个操作要在同一本地事物下进行  ）
 * @Date: Created in 20:44 2018/7/20
 */
public class IncreaseUserPointsSimpleJob implements SimpleJob {

    private static final Byte MESSAGE_CONSUMPTIONED = 1; //消息已经被处理
    private static final Byte MESSAGE_UNCONSUMPTIONED = 0; //消息没有被处理
    private static final Byte MESSAGE_POST = 1; // 消息没有发送
    private static final Byte MESSAGE_HANDLEED= 0; //消息已经被下游系统消费
    @Autowired
    private MessageEventPublishMapper messageEventPublishMapper;

    @Autowired
    private MessageEventProcessMapper messageEventProcessMapper;

    @Autowired
    private UserBonusPointsMapper userBonusPointsMapper;

    @Override
    public void execute(ShardingContext shardingContext) {
        System.out.println("定时扫描增加积分执行");
      //1: 扫描消息接收表 查询没有被处理的消
       MessageEventProcess messageEventProcess=messageEventProcessMapper.selectByStatus();
       if (messageEventProcess!=null){
        // 2: 处理消息 修改  消息接收表该消息的状态 和  发送消息表 该消息的状态
        messageEventProcess.setStatus(MESSAGE_CONSUMPTIONED);
        messageEventProcessMapper.updateByPrimaryKeySelective(messageEventProcess);
        // 取出 消息里面的 信息
        JSONObject jsonObject=JSONObject.parseObject(messageEventProcess.getPayload());
        // 获取 用户 id  增加 积分的 多少 被发送消息的id
        Long messageId=jsonObject.getLong("messageId");
        Long userUuid=jsonObject.getLong("userUuid");
        Integer userPoints=jsonObject.getInteger("userPoints");
        // 查询已经处理的消息 改变消息发送表该消息的状态
        MessageEventPublish messageEventPublish= messageEventPublishMapper.selectByPrimaryKey(messageId);
        messageEventPublish.setStatus(MESSAGE_HANDLEED);
        messageEventPublishMapper.updateByPrimaryKeySelective(messageEventPublish);
        //1增加用户 2:增加该用户的积分
     UserBonusPoints userBonusPoints=userBonusPointsMapper.selectByUserUuId(userUuid); //查询 用户
     userBonusPoints.setPoints(userBonusPoints.getPoints()+userPoints);
     //更新用户积分表
        userBonusPointsMapper.updateByPrimaryKeySelective(userBonusPoints);}
    }
}
